package manager

import (
	"encoding/json"
	"fmt"
	"go-ws-server/utils"
	"log"
	"sync"

	"github.com/gorilla/websocket"
)

type User struct {
	name string
	age  int
	sex  string
}

var conns = make(map[string]*websocket.Conn)
var mu sync.RWMutex

// WebSocket 连接注册功能，用于将用户 ID 与其对应的 WebSocket 连接关联存储。
func Register(userId string, conn *websocket.Conn) {
	mu.Lock()
	defer mu.Unlock()
	conns[userId] = conn

	// 添加到 Redis 在线列表
	utils.SAdd("online:users", userId)

	log.Println("用户", userId, "已连接")

}

// WebSocket 连接取消注册（注销）功能，用于从连接池中移除指定用户的 WebSocket 连接
func Unregister(userId string) {
	mu.Lock()
	defer mu.Unlock()
	delete(conns, userId)

	// 从 Redis 移除在线状态
	utils.SRem("online:users", userId) // 下线
}

// 推送消息给指定的人
func SendToUser(userId string, data interface{}) error {
	mu.RLock()
	conn, ok := conns[userId]
	mu.RUnlock()

	if !ok {
		return fmt.Errorf("user %s is offline", userId) // 明确返回错误
	}

	// 构造消息体
	resp := map[string]interface{}{
		"cmd":  100001,
		"data": data,
	}

	msgBytes, err := json.Marshal(resp)
	if err != nil {
		return fmt.Errorf("failed to marshal message: %w", err)
	}

	if err := conn.WriteMessage(websocket.TextMessage, msgBytes); err != nil {
		return fmt.Errorf("failed to send message: %w", err)
	}

	log.Printf("✅ Message sent to user %s: %s", userId, string(msgBytes))
	return nil
}
